iT邦幫忙

2021 iThome 鐵人賽

DAY 11
1
Software Development

從 JavaScript 角度學 Python系列 第 11

從 JavaScript 角度學 Python(11) - 串列 20 種操作的方法

  • 分享至 

  • xImage
  •  

前言

前面簡單聊了字典與串列之後,接下來我想額外拉一篇輕鬆無負擔的章節來描述與紀錄一下關於 Python 的串列處理。

JavaScript 的 20 種操作方法

在 JavaScript 中我們有高達約二十種的陣列操作方法,為了避免怕你忘記,所以以下也列出來給你回味一下:

  • shift
  • unshift
  • pop
  • push
  • splice
  • sort
  • reverse
  • length
  • join
  • reduce
  • reduceRight
  • indexOf
  • lastindexOf
  • some
  • every
  • forEach
  • map
  • filter
  • slice
  • concat

那麼 Python 呢?也會有這些類似 JavaScript 一樣多的陣列操作方法嗎?基本上是有的,而這邊我也盡可能依據兩種模式來分類:

  • 可能會因為操作而影響原有串列的方法
  • 不會影響原有串列的方法

底下也會搭配簡短的說明與範例來呈現。

所以這一篇相對會輕鬆一點,主要有點類似了解一下這些操作方法怎麼使用,如果這邊有遺漏或者寫錯就多多見諒(因為實在太多啦~~~)。

我粗估算了一下我列出來的數量也剛剛好與 JavaScript 相同都是二十種,而這一篇我就不會放上任何迷因圖哩。

可能會因為操作而影響原有串列的方法

基本上這邊的分類有可能會因為你的操作而導致原始串列的改變,所以在使用上就要多加注意一下,否則你有可能會寫出 Bug。

insert

將資料往特定索引位置塞入,請注意第一個參數是索引位置,第二個則是要塞入的內容,除此之外,所以位置是以 0 當作起始點唷。

lis = ['A', 'B', 'C']
lis.insert(1, 'Q')
print(lis) # ['A', 'Q', 'B', 'C']

append

append 與 JavaScript 的 push 方法有 87% 像,因此你也可以把它理解成 push 語法,因為它會在串列的最後一個插入資料。

lis = ['A', 'B', 'C']
lis.append('Q')
print(lis) # ['A', 'B', 'C', Q]

pop

pop 會將串列最後一筆給取出來:

lis = ['A', 'B', 'C']
print(lis.pop()) # C
print(lis) # ['A', 'B']

但是如果你傳入索引位置的話,則會變成指定取出:

lis = ['A', 'B', 'C']
print(lis.pop(1)) # B
print(lis) # ['A', 'C']

extend

extend 在翻譯上是擴展、延長的意思,所以它的概念類似於串列相加的概念。

lisA = ['A', 'B', 'C']
lisB = ['D', 'E', 'F']
lisA.extend(lisB)

print(lisA) # ['A', 'B', 'C', 'D', 'E', 'F']
print(lisB) # ['D', 'E', 'F']

sort

sort 非常的簡單,就是將串列中的內容作排序,基本上而排序的方式則是會依據 ASCII 去排序。

lis = [14, 30, 35, 42, 5, 16, 70, 98, 19, 100]
lis.sort()
print(lis) # [5, 14, 16, 19, 30, 35, 42, 70, 98, 100]

reverse

reverse 應該不用太多的說明了,就是反轉串列的意思。

lis = ['A', 'B', 'C', 'D', 'E', 'F']
lis.reverse()
print(lis) # ['F', 'E', 'D', 'C', 'B', 'A']

remove

remove 在運作上是採用內容的方式去刪除,假設如果你只知道該內容是什麼,但不知道索引位置,那就可以使用該方法。

lis = ['A', 'B', 'C', 'D', 'E', 'F']
lis.remove('D')
print(lis) # ['A', 'B', 'C', 'E', 'F']

clear

clear 非常的乾脆,就是直接清空串列。

lis = ['A', 'B', 'C', 'D', 'E', 'F']
lis.clear()
print(lis) # []

不會影響原有串列的方法

接下來這邊的操作上是不太會影響原有的串列。

len

len 非常好懂,與 JavaScript 的 length 非常相像,可以用於回傳陣列長度。

lisA = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(len(lisA))  # 10

lisB = ['r', 'a', 'y']
print(len(lisB)) # 3

index

找出串列中特定東西的索引位置,請注意 index 是以 0 為起始。

lis = ['r', 'a', 'y']

print(lis.index('r')) # 0
print(lis.index('a')) # 1
print(lis.index('y')) # 2
print(lis) # ['r', 'a', 'y']

reversed

reversedreverse 非常的像,但是它不會影響原有的串列,因此反轉後會回傳一個新的串列,但請注意要使用 list 重新轉換。

lis = ['A', 'B', 'C', 'D', 'E', 'F']
print(list(reversed(lis))) # ['F', 'E', 'D', 'C', 'B', 'A']
print(lis) # ['A', 'B', 'C', 'D', 'E', 'F']

sorted

sortedsort 也非常類似,但是它並不會影響到原有的串列。

lis = [14, 30, 35, 42, 5, 16, 70, 98, 19, 100]
print(sorted(lis)) # [5, 14, 16, 19, 30, 35, 42, 70, 98, 100]
print(lis) # [14, 30, 35, 42, 5, 16, 70, 98, 19, 100]

list

list 雖然可以拿來做轉換,但是它也可以拿來拷貝一份新的陣列。

在看範例之前,我想先補充一下,下面範例我有使用一個很特別的方法叫做 id(),這個方法可以回傳記憶體的位置,而會在前面提到這個是因為我們會使用 list 拷貝一份串列出來,為了驗證兩者串列的不同才會使用 id()

lisA = [14, 30, 35, 42, 5, 16, 70, 98, 19, 100]
lisB = list(lisA)
print(id(lisA)) # 4464143936
print(id(lisB)) # 4464824640

lisA[0] = 1
print(lisB) # [14, 30, 35, 42, 5, 16, 70, 98, 19, 100]

slice

看到 slice 先不要興奮,在 Python 中的 slice 用法比較特別一點,主要是用 [:] 來切割串列,而不是 slice() 語法。

從起始 0 取到索引 4 的位置:

lisA = ['A', 'B', 'C', 'D', 'E', 'F']
lisB = lisA[:4]
print(lisA) # ['A', 'B', 'C', 'D', 'E', 'F']
print(lisB) # ['A', 'B', 'C', 'D']

從起始索引 2 到 4 的位置:

lisA = ['A', 'B', 'C', 'D', 'E', 'F']
lisB = lisA[2:4]
print(lisA) # ['A', 'B', 'C', 'D', 'E', 'F']
print(lisB) # ['C', 'D']

從索引 3 開始往後取得全部:

lisA = ['A', 'B', 'C', 'D', 'E', 'F']
lisB = lisA[3:]
print(lisA) # ['A', 'B', 'C', 'D', 'E', 'F']
print(lisB) # ['C', 'D', 'F']

copy

copy 方法就非常直覺就是拷貝的意思:

lisA = [14, 30, 35, 42, 5, 16, 70, 98, 19, 100]
lisB = lisA.copy()
print(id(lisA)) # 4464143936
print(id(lisB)) # 4464824640

filter

filter 用法其實與我們在寫 JavaScript filter 語法雷同可以用來做篩選資料的行為:

lisA = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def count(item):
  return item % 2 == 0

newList = filter(count, lisA)

print(list(newList)) # [2, 4, 6, 8, 10]
print(lisA) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

map

map 會建立一個新的陣列,然後依據你傳入的函式去回傳。

lisA = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def count(item):
  return item + item

newList = map(count, lisA)

print(list(newList)) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
print(lisA) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

any

any 概念類似 JavaScript 的 some,只要裡面有一個 True 那麼就會回傳 True

lisA = [True, True, True]

print(any(lisA)) # True
lisB = [True, True, False]
print(any(lisB)) # True

all

all 對比 JavaScript 的話,則是 every,只要有一個是 False 那麼就會回傳 False

lisA = [True, True, True]
print(all(lisA)) # True

lisB = [True, True, False]
print(all(lisB)) # False

join

join 會依據你傳入的變數內容來轉換成另一種形式呈現,而這個在呈現上也與 JavaScript 非常雷同。

lisA = ['A', 'B', 'C']
lisB = ['D', 'E', 'F']
s = '-'
print(s.join(lisA)) # A/B/C
print(lisA) # ['A', 'B', 'C']

參考文獻

作者的話

因為改買了紹興酒,所以今天跑去全聯買了雞蛋與去骨雞腿,只是這一次額外嘗試挑戰紹興酒蛋,但酒蛋必須是溏心蛋,所以只好明天來研究一下如何製作溏心蛋。

關於兔兔們

兔法無邊


上一篇
從 JavaScript 角度學 Python(10) - 容器型別(下)
下一篇
從 JavaScript 角度學 Python(12) - 運算子
系列文
從 JavaScript 角度學 Python31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
Yanwei Liu
iT邦新手 4 級 ‧ 2021-09-12 09:07:30

您好,sorted的Python程式碼部分有錯誤喔~

Ray iT邦研究生 4 級 ‧ 2021-09-12 09:25:48 檢舉

感謝告知,已經修正惹~~~
太習慣用點運算子接東西,結果自己寫了沒注意到 QQ

~我還以為都沒人看了~

我要留言

立即登入留言